package com.nyist.lockCase;

import org.jetbrains.annotations.NotNull;

/**
 * 1. 使用继承的形式创建多线程的时候
 * 如果不使用 static 关键字, 做锁对象, 那么每次创建一个新的线程的时候就会创建一个新的锁对象
 * 导致锁不到同一个对象, 出现锁失效的情况
 * static 关键字的作用是, 在类初始化的过程中, 只加载一次, 有且仅有一次, 保证了每次创建都是同一个对象
 *
 * @ClassName ThreadExtendsCreate
 * @Description
 * @Author xiaoyang
 * @Date 2023/04/08/18:35
 */
public class ThreadExtendsCreate extends Thread {
    static final Object lockObj = new Object();
    //  final Object lockObj = new Object();
    private static int ticket = 100;

    public ThreadExtendsCreate() {
    }

    public ThreadExtendsCreate(@NotNull String name) {
        super(name);
    }

    @Override
    public void run() {
        while (true) {
            synchronized (lockObj) {
                try {
                    Thread.sleep(100);
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
                if (ticket > 0) {
                    System.out.println("=====>>>currentThread: " + Thread.currentThread().getName() + " ing,by sell " + ticket + " ticket , and random: ");
                    ticket--;
                } else {
                    break;
                }
            }
        }
    }
}
